[Amazon FSx for NetApp ONTAP] 文字マッピングをして本来ファイル名に使えない文字をWindowsで表示できるようにした
~1 って名前のファイルがあるけどなんだ
こんにちは、のんピ(@non____97)です。
皆さんはAmazon FSx for NetApp ONTAP(以降FSx for ONTAP)を使用していて「~1」という名前のファイルに遭遇したいこと思ったことはありますか? それはもしかしたらWindowsで使用できない文字がファイル名に含まれるファイルかもしれません。
Windowsの場合、ファイル名、フォルダ名に以下の文字を含めることはできません。
\
: バックスラッシュ/
: スラッシュ:
: コロン*
: アスタリスク?
: 疑問符“
: ダブルクォーテーション<
: 小なり>
: 大なり|
: パイプ
Linuxクライアントであれば上述の文字を含む名前のファイル、ディレクトリを作成することが可能です。
FSx for ONTAPはNFS/SMBどちらのプロトコルも使用可能です。ONTAPがマルチプロトコルが故に気にしなければならないポイントですね。
マルチプロトコルのファイルサーバーを使っている以上、上述の文字をファイル名を使わないに越したことはないですが、のっぴきならない事情で使う場面もあると思います。
そのような場合は、ボリュームの文字マッピング機能で対応可能です。文字マッピング機能とはその名の通り、上述のようなWindows(正しくはSMBクライアント)で扱えない文字を別の文字に変換する機能です。
試してみたので紹介します。
いきなりまとめ
- 文字マッピングをすることで本来ファイル名に使えない文字をWindowsで表示できるようになる
- 文字マッピングはボリュームごと設定する必要がある
- 下位のジャンクションパスに継承はされない
- 文字マッピング先の文字は普段使用しない文字が良い
- 重複してしまうと区別ができず、意図しない挙動をする可能性がある
文字マッピングの仕組み
文字マッピングの仕組みを確認します。
文字マッピングはSMBで接続した場合に動作するようです。NFSクライアントによって作成されたファイルを参照しようとするとONTAPがファイル名をチェックし、SMBクライアントで有効でない文字を含む場合は事前に定義したマッピング情報に基づいて変換します。
SMB クライアントが NFS クライアントによって作成されたファイルにアクセスすると、 ONTAP はファイル名を調べます。ファイル名が有効な SMB ファイル名でない場合は(たとえば、コロンが含まれている場合)、 ONTAP は各ファイルに対して保持されている 8.3 形式のファイル名を返します。ただし、これにより、長いファイル名に重要な情報をエンコードするアプリケーションで問題が発生します。
したがって、異なるオペレーティングシステムを使用するクライアント間でファイルを共有する場合は、両方のオペレーティングシステムで有効な文字をファイル名に使用する必要があります。
ただし、 SMB クライアントで有効でない文字を含む NFS クライアントが作成したファイル名がある場合は、無効な NFS の文字を、 SMB と特定の Windows アプリケーションの両方で有効な Unicode 文字に変換するマッピングを定義できます。たとえば、この機能は CATIAR MCAD および Mathematica アプリケーションをサポートしていますが、同じ要件を持つほかのアプリケーションでも使用できます。
注意事項は以下の通りです。
- 文字マッピングは、ジャンクションポイントをまたいで適用されません。
- 文字マッピングは、各ジャンクションボリュームに対して明示的に設定する必要があります。
- 無効な文字を表す Unicode 文字が、通常はファイル名に使用されないようにする必要があります。これらの文字が使用されていた場合、不要なマッピングが発生します。
- たとえば ' コロン (:) をハイフン (-) にマップしようとした場合 ' ファイル名にハイフン (-) が正しく使用されていれば 'Windows クライアントが "a-b
" という名前のファイルにアクセスしようとすると ' その要求は NFS 名 "a:b
" にマップされます ( 望ましい結果ではありません )- 文字マッピングを適用してもまだマッピングに無効な Windows 文字が含まれている場合、 ONTAP は Windows 8.3 ファイル名にフォールバックします。
- FPolicy 通知、 NAS 監査ログ、セキュリティトレースメッセージでは、マッピングされたファイル名が表示されます。
- タイプが DP である SnapMirror 関係が作成されても、ソースボリュームの文字マッピングはデスティネーション DP ボリュームにレプリケートされません。
- 大文字と小文字の区別:マッピングされた Windows 名は NFS 名に変換されるため、名前の検索は NFS のセマンティクスに従います。NFS ルックアップでは大文字と小文字が区別されるという事実も含まれます。つまり、マッピングされた共有にアクセスするアプリケーションは、 Windows の大文字と小文字を区別しない動作に依存しません。ただし、 8.3 形式の名前は大文字と小文字が区別されません。
- 部分マッピングまたは無効なマッピング:ディレクトリ列挙(「 dir 」)を実行しているクライアントに返すように名前をマッピングしたあと、結果の Unicode 名について Windows の有効性がチェックされます。その名前にまだ無効な文字が含まれている場合、または Windows で無効な文字が含まれている場合(「 . 」または空白で終わる場合など)は、無効な名前の代わりに 8.3 形式の名前が返されます。
マッピングできる文字は以下の通りです。
Unicode | 文字 | 説明 |
---|---|---|
0x01-0x19 | Not applicable | 表示されない制御文字 |
0x5C | \ | バックスラッシュ |
0x3A | : | コロン |
0x2A | * | アスタリスク |
0x3F | ? | 疑問符 |
0x22 | " | ダブルクォーテーション |
0x3C | < | 小なり |
0x3E | > | 大なり |
0x7C | | パイプ | |
0xB1 | ± | プラスマイナス |
検証環境
検証環境は以下の通りです。
AD DCは以下記事の検証をしたときの環境をそのまま使用します。
Windows上で使用できない文字を含むファイル名のファイルをNFSクライアントから作成し、AD DCから表示しようとするとどのような挙動をするのか確認します。
やってみた
それでは、やってみます。
NFSクライアントからFSx for ONTAP上のジャンクションパスが/vol1
のボリュームをマウントし、<コロン>:です.txt
というファイルを作成します。
# /vol1 をマウント $ sudo mount -t nfs svm-07a067590e6c8fb2b.fs-0ca3d1e244ed3089b.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/ # NFSで /vol1 をマウントできたことを確認 $ df -hT -t nfs4 Filesystem Type Size Used Avail Use% Mounted on svm-07a067590e6c8fb2b.fs-0ca3d1e244ed3089b.fsx.us-east-1.amazonaws.com:/vol1 nfs4 973M 448K 973M 1% /mnt/fsxn # <コロン>:です.txt という名前のテキストファイルを作成 $ echo コロン | sudo tee /mnt/fsxn/\<コロン\>:です.txt > /dev/null # ファイルが作成されたことを確認 $ ls -l /mnt/fsxn/ total 0 -rw-r--r-- 1 root root 10 Dec 13 05:50 <コロン>:です.txt # ファイルの内容を表示できるか確認 $ cat /mnt/fsxn/\<コロン\>\:です.txt コロン
作成できました。
次にAD DCのZドライブにルートボリュームのファイル共有c$
をマウントし、/vol1
のフォルダ配下に<コロン>:です.txt
があるか確認します。
# Zドライブにマウントされていることを確認 > Get-PSDrive Name Used (GB) Free (GB) Provider Root CurrentLocation ---- --------- --------- -------- ---- --------------- Alias Alias C 15.94 14.06 FileSystem C:\ Users\Administrator Cert Certificate \ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE Variable Variable WSMan WSMan Z 0.00 0.95 FileSystem \\SVM.CORP.NON-97.NET\c$ # /vol1 配下に <コロン>:です.txt という名前のテキストファイルがあるか確認 > ls -l Z:\vol1\ Directory: Z:\vol1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 12/12/2022 7:50 PM 10 ~1.TXT
そこにあるのは~1.TXT
でした。拡張子が.TXT
と大文字になっていることから8.3形式に変換されていそうです。
エクスプローラーから確認しても~1
となっています。
ファイルの内容は特に文字化けはしていません。
それでは文字マッピングを行います。今回は以下のようにマッピングします。
マッピング元 | マッピング先 |
---|---|
: (0x3A) | α (03B1) |
< (0x3C) | β (03B2) |
> (0x3E) | γ (03BC) |
文字マッピングの作成はcifs character-mapping createで行います。
# デフォルトでは文字マッピングが存在しないことを確認 FsxId0ca3d1e244ed3089b::> cifs character-mapping show This table is currently empty. # 文字マッピングの作成 FsxId0ca3d1e244ed3089b::> cifs character-mapping create -vserver SVM -volume vol1 -mapping 3a:03b1, 3c:03b2, 3e:03b3 # 文字マッピングの設定確認 FsxId0ca3d1e244ed3089b::> cifs character-mapping show Vserver Volume Name Character Mapping -------------- ----------- ------------------------------------------ SVM vol1 3a:03b1, 3c:03b2, 3e:03b3
文字マッピング後のファイル名を確認します。
> ls Z:\vol1\ Directory: Z:\vol1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 12/12/2022 7:50 PM 10 βコロンγαです.txt
設定した通りに文字マッピングされ、βコロンγαです.txt
と表示されるようになりました。
エクスプローラーから見た時もβコロンγαです.txt
と表示されますね。
おしまい。
と思いましたが、文字マッピングした結果同じファイル名になるとどうなるのか気になりました。試してみましょう。
NFSクライアントからβコロンγαです.txt
というファイルを作成します。
# NFSクライアントから見た時は文字マッピングされていないことを確認 $ ls -l /mnt/fsxn/ total 0 -rw-r--r-- 1 root root 10 Dec 13 05:50 <コロン>:です.txt $ cat /mnt/fsxn/\<コロン\>\:です.txt コロン # SMBクライアントから見たときに文字マッピングされたファイル名と同じ名前になるようなファイルを作成 $ echo マッピングしていないファイルだよ | sudo tee /mnt/fsxn/βコロンγαです.txt > /dev/null # ファイルが作成されたことを確認 $ ls -l /mnt/fsxn/ total 0 -rw-r--r-- 1 root root 10 Dec 13 05:50 <コロン>:です.txt -rw-r--r-- 1 root root 49 Dec 13 08:41 βコロンγαです.txt $ cat /mnt/fsxn/βコロンγαです.txt マッピングしていないファイルだよ
それではAD DCから確認してみます。
> ls Z:\vol1\ Directory: Z:\vol1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 12/12/2022 7:50 PM 10 βコロンγαです.txt -a---- 12/12/2022 10:41 PM 49 βコロンγαです.txt
βコロンγαです.txt
というファイルが2つありますね。これは見分けがつきません。
エクスプローラーから両方のファイルを開いてみます。すると、どちらも文字マッピングがされていないβコロンγαです.txt
になってしまいました。
先述した注意事項にあった以下記載の通り、文字マッピング先の文字は普段使用しない文字にするのが良さそうです。
無効な文字を表す Unicode 文字が、通常はファイル名に使用されないようにする必要があります。これらの文字が使用されていた場合、不要なマッピングが発生します。
マルチプロトコルだからこそ互いのプロトコルに思いやりを持って接しよう
Amazon FSx for Net App ONTAPの文字マッピング機能を使用して、本来ファイル名に使えない文字をWindowsで表示できるようにしました。
文字マッピングすることでSMBで接続した時も文字化けせずにファイルを認識できます。
ただし、普段使用しない文字がマッピング先に推奨されるため、そのような文字をマッピング先に指定すると文字化けしているように見えてしまいます。そのため、NFSクライアントからファイル名を編集するときはSMBクライアントが扱えない文字を使用しないように気をつけると良いでしょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!